package org.zjx.state;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.zjx.enums.prop.SlotType;
import org.zjx.model.prop.ItemInstance;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 物品状态管理类
 * 负责管理角色所有物品的状态和位置信息
 */
@Data
public class ItemState implements IDataState {
    // 按槽位类型存储的物品列表
    private final Map<SlotType, List<ItemInstance>> items = new EnumMap<>(SlotType.class);


    /**
     * 初始化物品状态
     * @param slotTypes 需要初始化的槽位类型
     */
    public void initialize(Set<SlotType> slotTypes) {
        for (SlotType type : slotTypes) {
            // 初始化物品列表
            items.put(type, new ArrayList<>(type.getCapacity()));
        }
    }

    public void addItem(SlotType slotType, ItemInstance itemInstance) {
        items.get(slotType).add(itemInstance);
    }

    /**
     * 获取指定槽位的物品
     * @param slotType 槽位类型
     * @param position 位置索引
     * @return 物品实例或null
     */
    public ItemInstance getItem(SlotType slotType, int position) {
        if (!items.containsKey(slotType) || position < 0 || position >= items.get(slotType).size()) {
            return null;
        }
        return items.get(slotType).get(position);
    }

    /**
     * 获取指定类型的所有物品
     * @param slotType 槽位类型
     * @return 物品列表(不可修改)
     */
    public List<ItemInstance> getItemsByType(SlotType slotType) {
        return Collections.unmodifiableList(items.getOrDefault(slotType, new ArrayList<>()));
    }

    /**
     * 查找指定模板名称的物品
     * @param itemName 物品模板名称
     * @return 匹配的物品列表
     */
    public List<ItemInstance> findItemsByTemplate(String itemName) {
        return items.values().stream()
                .flatMap(List::stream)
                .filter(item -> item != null && Objects.equals(item.getName(), itemName))
                .collect(Collectors.toList());
    }


    /**
     * 物品位置内部类
     */
    @Data
    @AllArgsConstructor
    private static class ItemLocation {
        private final SlotType slotType;
        private final int position;
    }
}